/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import DTO.Phong_DTO;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Lenh Ho Xung
 */
public class Phong_DAO {

    private static String sqlString;
    private static MSSQLConnect cn;
    private static ResultSet rs;

    public static DefaultTableModel addTable(ResultSet rs) throws Exception {
        DefaultTableModel table = new DefaultTableModel();
        ResultSetMetaData metaData = rs.getMetaData();
        int totalColumn = metaData.getColumnCount();
        Object[] dataRow = new Object[totalColumn];

        if (rs != null) {
            for (int i = 1; i <= totalColumn; i++) {
                table.addColumn(metaData.getColumnName(i));
            }
            while (rs.next()) {
                for (int i = 1; i <= totalColumn; i++) {
                    dataRow[i - 1] = rs.getObject(i);
                }
                table.addRow(dataRow);
            }

        }
        return table;

    }

    //lấy danh sách phòng
    public static DefaultTableModel layDanhSachPhong() throws Exception {
        DefaultTableModel table = new DefaultTableModel();
        sqlString = "SELECT p.MaPhong as [Mã Phòng], lp.MaLoaiPhong as [Mã Loại Phòng], p.TenPhong as [Tên Phòng], lp.TenLoaiPhong as [Tên Loại Phòng], "
                + "lp.DonGia as [Đơn Giá], p.TinhTrang as [Tình Trạng], p.GhiChu as [Ghi Chú] "
                + "  FROM PHONG p INNER JOIN LOAIPHONG lp ON p.MaLoaiPhong=lp.MaLoaiPhong";

        try {
            //thực hiện câu truy vấn
            cn = new MSSQLConnect();
            //thực hiện câu truy vấn
            rs = cn.excuteQuery(sqlString);
            table = addTable(rs);
        } catch (Exception e) {
            throw new Exception("Không thể lấy danh sách phòng");
        } finally {
            cn.Close();
        }
        return table;

    }

    public static DefaultTableModel layDanhSachPhongTrong() throws Exception {
        DefaultTableModel table = new DefaultTableModel();
        sqlString = "SELECT p.MaPhong as [Mã Phòng],lp.TenLoaiPhong [Tên Loại Phòng],"
                + "lp.DonGia as [Đơn Giá]"
                + " FROM PHONG p INNER JOIN LOAIPHONG lp ON p.MaLoaiPhong=lp.MaLoaiPhong and p.TinhTrang= N'Trống'";

        try {
            //thực hiện câu truy vấn
            cn = new MSSQLConnect();
            //thực hiện câu truy vấn
            rs = cn.excuteQuery(sqlString);
            table = addTable(rs);
        } catch (Exception e) {
            throw new Exception("Không thể lấy danh sách phòng trống");
        } finally {
            cn.Close();
        }
        return table;

    }

    public static DefaultTableModel laydanhsachPhongDeThue() throws Exception {
        DefaultTableModel table = new DefaultTableModel();
        sqlString = "SELECT p.MaPhong as [Mã Phòng],lp.TenLoaiPhong [Tên Loại Phòng], lp.DonGia as [Đơn giá],"
                + "p.TinhTrang as [Tình trạng]"
                + " FROM PHONG p inner join  LOAIPHONG lp ON p.MaLoaiPhong=lp.MaLoaiPhong and p.TinhTrang in (N'Trống', N'Đang đặt')";

        try {
            //thực hiện câu truy vấn
            cn = new MSSQLConnect();
            //thực hiện câu truy vấn
            rs = cn.excuteQuery(sqlString);
            table = addTable(rs);
        } catch (Exception e) {
            throw new Exception("Không thể lấy danh sách phòng để thuê");
        } finally {
            cn.Close();
        }
        return table;

    }
    //thêm phòng

    public static int Insert(Phong_DTO p) throws Exception {
        int n = 0;
        sqlString = "INSERT INTO PHONG(MaPhong,TenPhong,MaLoaiPhong,TinhTrang,GhiChu) VALUES('"
                + p.getMaPhong() + "','"
                + p.getTenPhong() + "','"
                + p.getMaloaiPhong() + "',N'"
                + p.getTinhTrang() + "', N'"
                + p.getGhiChu() + "')";

        //Kết nối CSDL
        try {
            cn = new MSSQLConnect();
            n = cn.executeUpdate(sqlString);
        } catch (Exception e) {
            System.out.print(e.toString());
            //throw new Exception("Không thể lấy danh sách phòng");
        } finally {
            cn.Close();
        }
        return n;
    }

    //xóa
    public static int Delete(String maPhong) throws Exception {
        int n;
        sqlString = "DELETE FROM PHONG WHERE MaPhong='" + maPhong + "'";
        try {
            cn = new MSSQLConnect();
            //Thực thi câu lệnh SQL
            n = cn.executeUpdate(sqlString);

        } catch (Exception e) {
            throw new Exception("Lỗi Kết Nối Cơ sở dữ liệu.");
        } finally {
            cn.Close();
        }
        return n;
    }

    //cập nhật phòng
    public static int Update(Phong_DTO p) throws Exception {
        int n;
        sqlString = "UPDATE PHONG SET TenPhong='" + p.getTenPhong()
                + "',GhiChu=N'" + p.getGhiChu()
                + "',TinhTrang=N'" + p.getTinhTrang()
                + "',MaLoaiPhong='" + p.getMaloaiPhong()
                + "' WHERE MaPhong='" + p.getMaPhong() + "'";
        try {
            cn = new MSSQLConnect();
            //Thực thi câu lệnh SQL
            n = cn.executeUpdate(sqlString);

        } catch (Exception e) {
            throw new Exception("Lỗi Kết Nối Cơ sở dữ liệu.");
        } finally {
            cn.Close();
        }
        return n;
    }

    //tạo mã tự động   
    public static String taoMaTuDong(String maGoc, int batDau) throws Exception {
        String str, kq;
        int so;
        try {
            str = maGoc.substring(batDau);
            kq = maGoc.substring(0, batDau);
            so = Integer.parseInt(str) + 1;
            for (int i = 0; i < str.length() - Integer.valueOf(so).toString().length(); i++) {
                kq += "0";
                //return kq;
            }
            kq = kq + so;
        } catch (Exception x) {
            return null;
        }
        return kq;
    }

    //Nghiệp vụ tìm kiếm
    public static DefaultTableModel timPhongTheoTenLoaiPhong(String tenloaiPhong) throws Exception {
        DefaultTableModel table = new DefaultTableModel();
        sqlString = "Select p.MaPhong as [Mã Phòng], p.TenPhong as [Tên Phòng], lp.TenLoaiPhong as [Tên Loại Phòng],"
                + "lp.DonGia as [Ðơn Giá], p.TinhTrang as [Tình Trạng], p.GhiChu as [Ghi Chú] from PHONG p , LoaiPhong lp "
                + "Where p.MaLoaiPhong= lp.MaLoaiPhong AND TenLoaiPhong LIKE N'" + tenloaiPhong + "%'";

        try {
            //thực hiện câu truy vấn
            cn = new MSSQLConnect();
            //thực hiện câu truy vấn
            rs = cn.excuteQuery(sqlString);
            table = addTable(rs);
        } catch (Exception e) {
            throw new Exception("Không thể tìm phòng theo tên loại phòng");
        } finally {
            cn.Close();
        }
        return table;
    }
    //tim theo tinh trang
    public static DefaultTableModel timPhongTheoTinhTrang(String tinhTrang) throws Exception {
        DefaultTableModel table = new DefaultTableModel();
        sqlString = "Select p.MaPhong as [Mã Phòng], p.TenPhong as [Tên Phòng], lp.TenLoaiPhong as [Tên Loại Phòng],"
                + "lp.DonGia as [Ðơn Giá], p.TinhTrang as [Tình Trạng], p.GhiChu as [Ghi Chú] from PHONG p , LoaiPhong lp "
                + "Where p.MaLoaiPhong= lp.MaLoaiPhong AND TinhTrang LIKE N'" + tinhTrang + "%'";

        try {
            //thực hiện câu truy vấn
            cn = new MSSQLConnect();
            //thực hiện câu truy vấn
            rs = cn.excuteQuery(sqlString);
            table = addTable(rs);
        } catch (Exception e) {
            throw new Exception("Không thể tìm phòng theo tình trạng");
        } finally {
            cn.Close();
        }
        return table;
    }
    //tim theo ten loai phong va tinh trang
        public static DefaultTableModel timPhongTheoTLP_TT(String tinhTrang, String tenloaiPhong) throws Exception {
        DefaultTableModel table = new DefaultTableModel();
        sqlString = "Select p.MaPhong as [Mã Phòng], p.TenPhong as [Tên Phòng], lp.TenLoaiPhong as [Tên Loại Phòng],"
                + "lp.DonGia as [Ðơn Giá], p.TinhTrang as [Tình Trạng], p.GhiChu as [Ghi Chú] from PHONG p , LoaiPhong lp "
                + "Where p.MaLoaiPhong= lp.MaLoaiPhong AND TinhTrang LIKE N'" + tinhTrang + "%' and TenLoaiPhong LIKE N'"+tenloaiPhong+"%'";

        try {
            //thực hiện câu truy vấn
            cn = new MSSQLConnect();
            //thực hiện câu truy vấn
            rs = cn.excuteQuery(sqlString);
            table = addTable(rs);
        } catch (Exception e) {
            throw new Exception("Không thể tìm phòng theo tên loại phòng - tình trạng");
        } finally {
            cn.Close();
        }
        return table;
    }
    
    public static int capnhatTinhTrangPhong(String maPhong, String ttcapNhat) throws Exception {
        int n = 0;
        sqlString = "UPDATE PHONG SET TinhTrang=N'" + ttcapNhat + "' WHERE MaPhong='" + maPhong + "'";
        try {
            cn = new MSSQLConnect();
            n = cn.executeUpdate(sqlString);
        } catch (Exception e) {

            throw new Exception("Không thể cập nhật mã phòng sau khi đặt");
        } finally {
            cn.Close();
        }
        return n;
    }

    public static String layMaLPTheoMP(String maP) throws Exception {
        String kq = "";
        sqlString = "SELECT MaLoaiPhong FROM PHONG WHERE MaPhong = '" + maP + "'";
        try {
            //thực hiện câu truy vấn
            cn = new MSSQLConnect();
            //thực hiện câu truy vấn
            rs = cn.excuteQuery(sqlString);
            while (rs.next()) {
                kq = rs.getString("MaLoaiPhong");
            }
        } catch (Exception e) {
            throw new Exception("Không thể lấy mã loại phòng theo mã phòng");
        } finally {
            cn.Close();
        }
        return kq;
    }
}
